import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:方法的使用
 * User: liangyuanzhang
 * Date: 2024-11-28
 * Time: 23:35
 */
public class Test {
    //无重复计算 --> 比递归好
    public static int fib2(int n){
        int f1 = 1;
        int f2 = 1;
        int f3 = 1;
        for (int i = 3; i <= n; i++) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }
    //有重复计算
    public static int fib(int n ){
        if(n == 1 || n == 2){
            return 1;
        }
        return fib(n-1) + fib(n -2);
    }
    //递归求斐波那契额数列
    public static void main(String[] args) {
        System.out.println(fib2(1));
        System.out.println(fib2(2));
        System.out.println(fib2(3));
        System.out.println(fib2(4));
        System.out.println(fib2(5));

    }
    public static int sumFunc(int n){
        if(n < 10){
            return n;
        }
        return n % 10 + sumFunc(n/10);
    }
    //输入 1729, 则应该返回
    //1+7+2+9，它的和是19
    public static void main7(String[] args) {
        System.out.println(sumFunc(123));
    }

    public static int sum(int n){
        if (n == 0) {
            return n;
        }
        return n + sum(n-1);
    }
    //递归求 1 + 2 + 3 +...+ 10
    public static void main6(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()){
            int n = scanner.nextInt();
            System.out.println(sum(n));
        }
        scanner.close();
    }
    public static void print(int n){
        if(n < 10){
            System.out.println(n);
            return;
        }
        print(n/10);
        System.out.println(n % 10);
    }
    //按顺序打印1 2 3
    public static void main5(String[] args) {
        print(123);
    }
    //递归
    /*
    1.有一个递归公式
    2.找到当前问题的递归 “结束条件” - 结束条件等同于起始条件
    递归这个只是不是练习多了 就能会的！！！
    递归的另一个难点：很多同学喜欢在脑海里 展开代码

    递          归
     */
    //求n的阶乘
    public static int fac(int n){
        if(n == 1) return 1;
        return n* fac(n-1);
    }
    public static void main4(String[] args) {
        System.out.println(fac(3));
    }


    //以下是方法的重载
    /*
    后面有面试问题：重载 和 重写的区别

    1.方法名一样
    2.参数列表不一样【个数、类型、顺序】
    返回值不做要求
     */
    public static int add(int a,int b){
        return a+b;
    }

    public static int add(int a,int b,short c){
        return a+b+c;
    }

    public static int add(short c,int a,int b){
        return a+b+c;
    }

    public static int add(int a,int b,int c){
        return a+b+c;
    }

    public static double add(double a,double b){
        return a+b;
    }

    public static void main3(String[] args) {
        int x = 1;
        int y = 2;
        int ret = add(x,y);
        System.out.println(ret);

        double d1 = 1.0;
        double d2 = 2.0;
        double ret2 = add(d1,d2);



    }
    //学完类和对象以后 才能真正理解如何进行交换
    //交换 a和 b的值
    public static void swap(int a,int b){
        int tmp = a;
        a = b;
        b = tmp;
    }

    public static void main2(String[] args) {
        int x = 10;
        int y = 20;
        swap(x,y);
        System.out.println(x + " "+y);
    }

    //判断闰年的方法
    public static boolean isLeapYear(int year){
        System.out.println("方法被调用了......");
        if(year % 4 == 0 && year %100 != 0 || year % 400 == 0){
            return true;
        }else {
            return false;
        }
    }

    public static void main1(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        boolean ret = isLeapYear(i);
        if(ret){
            System.out.println(i + "是闰年");
        }else{
            System.out.println(i + "不是闰年");
        }
    }
}
